# 定义带参的装饰器

def set_args(args):
    print(args)
    def set_fun(func):
        print('set_func')
        def wrapper(*args,**kwargs):
            print('wrapper')
            return func(*args,**kwargs)
        return wrapper
    return set_fun

@set_args('haha')
def show():
    print('show')

show()

# 带参装饰器执行过程:
#
# 1.先执行set_args('参数') 得到 set_args函数中的返回值,也就是set_fun函数的引用
#
# 2.然后返回的引用和@进行组合,变成装饰器形式 @set_fun , 但是这时set_fun 函数因为是返回的闭包引用,所以保留了args的参数值
#
# 3.再调用 show 的时候,show 还是指向的 wrapper 函数，但是在这个函数中，可以使用外面两层函数的变量或参数
#
# 4.无论在何时，闭包有几层，最终被装饰的函数永远指向 wrapper 函数

